package com.example;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class ReflectionExample {
    public static void main(String[] args) {
        try {
            // 获取Person类的Class对象
            Class<?> personClass = Class.forName("com.example.Person");

            // 获取构造函数并创建实例
            Constructor<?> constructor = personClass.getConstructor(String.class, int.class);
            Object person = constructor.newInstance("John Doe", 30);

            // 获取并调用方法
            Method sayHelloMethod = personClass.getMethod("sayHello");
            sayHelloMethod.invoke(person);

            // 获取并设置私有字段值
            Field nameField = personClass.getDeclaredField("name");
            nameField.setAccessible(true); // 可访问私有字段
            nameField.set(person, "Jane Doe");

            // 再次调用方法
            sayHelloMethod.invoke(person);

            // 获取并读取字段值
            Object nameValue = nameField.get(person);
            System.out.println("Updated Name: " + nameValue);

            // 获取并调用方法
            Method getNameMethod = personClass.getMethod("getName");
            if (getNameMethod.isAnnotationPresent(Upper.class)) {
                // 如果getName()方法上有@Upper注解，将结果转换为大写
                String name = (String) getNameMethod.invoke(person);
                name = name.toUpperCase();
                System.out.println("Name in uppercase: " + name);
            } else {
                // 否则，直接输出结果
                System.out.println("Name: " + getNameMethod.invoke(person));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
